function addEvent(el, type, fn) {
  if(el.addEventListener) {
    el.addEventListener(type, fn, false);
  }else if(el.attachEvent) {
    // IE中的attachEvent接收的事件类型前加 'on'
    // fn中的this指向window
    el.attachEvent('on' + type, function() {
      fn.call(el);
    });
  }else {
    // 兼容性最好的句柄事件处理函数
    el['on' + type] = fn;
  }
}

function removeEvent(el, type, fn) {
  if(el.addEventListener) {
    el.removeEventListener(type, fn, false);
  }else if(el.attachEvent) {
    // IE中的attachEvent接收的事件类型前加 'on'
    // fn中的this指向window
    el.detachEvent('on' + type, function() {
      fn.call(el);
    });
  }else {
    // 兼容性最好的句柄事件处理函数
    el['on' + type] = null;
  }
}

// 封装获取pageXY值方法
function pagePos(e) {
  var sLeft = getScrollOffset().left, // x轴的滚动距离
      sTop = getScrollOffset().top, // y轴的滚动距离
      cLeft = document.documentElement.clientLeft || 0, // 文档x轴偏移距离
      cTop = document.documentElement.clientTop || 0; // 文档y轴偏移距离

  return {
    x: e.clientX + sLeft - cLeft,
    y: e.clientY + sTop - cTop
  }
}

function getScrollOffset() {
  if(window.pageXOffset) { // 该方法在IE9以下不支持
    return {
      left: window.pageXOffset,
      top: window.pageYOffset
    }
  }else {
    return { // 在chrome中他俩必定有一个为0，所以就相加
      left: document.body.scrollLeft + document.documentElement.scrollLeft,
      top: document.body.scrollTop + document.documentElement.scrollTop
    }
  }
}

function getViewportSize() {
  if(window.innerWidth) {
    return {
      width: window.innerWidth,
      height: window.innerHeight
    }
  }else {
    // 如果是IE的怪异模式
    if(document.compatMode === 'BackCompat') {
      return {
        width: document.body.clientWidth,
        height: document.body.clientHeight
      }
    // 是标准模式 CSS1Compat
    }else {
      return {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight
      }
    }
  }
}

function getScrollSize () {
  if(document.body.scrollWidth) {
    return {
      width: document.body.scrollWidth,
      height: document.body.scrollHeight
    }
  }else {
    return {
      width: document.documentElement.scrollWidth,
      height: document.documentElement.scrollHeight
    }
  }
}

/**
 * @elemChildren 寻找子元素程序
 * @param node：父节点元素
 */
function elemChildren(node) {
  // 声明一个类数组用作缓冲池来保存 子元素
  var temp = {
    'length': 0,
    'push': Array.prototype.push,
    'splice': Array.prototype.splice
  }

  var children = node.childNodes, // 保存所有的子节点元素
      len = children.length, 
      item; // 临时变量保存单个子元素

  for(var i = 0; i < len; i ++) {
    item = children[i];

    // 子节点元素的类型为元素节点
    if(item.nodeType === 1) {
      temp.push(item);
    }
  }

  return temp;
}

/**
 * @elemParent 寻找父级元素
 * @param node: 目标元素
 * @param n：寻找第n层父级元素
 */ 
function elemParent(node, n) {
  var type = typeof(n);

  if(type === 'undefined') {
    return node.parentNode;
  }else if(n <=0 || type !== 'number') {
    return undefined;
  }

  while(n) {
    node = node.parentNode;
    n--;
  }

  return node;
}

/**
 * @getStyles 封装样式查看程序
 * @param
 *    elem：目标DOM元素
 *    prop：要查看的属性名
 */ 
function getStyles(elem, prop) {
  // 查看样式函数getComputedStyle方法保存在window下
  // getComputedStyle方法的第二个参数用来查看伪元素, IE8以下不支持
  if(window.getComputedStyle) {
    if(prop) {
      return parseInt(window.getComputedStyle(elem, null)[prop]);
    }else {
      return window.getComputedStyle(elem);
    }
  }else {
    if(prop) {
      // IE替代方案
      return elem.currentStyle[prop];
    }else {
      return elem.currentStyle;
    }
  }
}

/**
 * 判断一个点是否在三角形内
 */ 
function vec(a, b) {
  return {
    x: b.x - a.x,
    y: b.y - a.y
  }
}

function vecProduct(v1, v2) {
  return v1.x * v2.y - v2.x * v1.y;
}

function sameSymbols(a, b) {
  return (a ^ b) >= 0;
}

function pointInTriangle(p, a, b, c) {
  var PA = vec(p, a),
      PB = vec(p, b),
      PC = vec(p, c),
      R1 = vecProduct(PA, PB),
      R2 = vecProduct(PB, PC),
      R3 = vecProduct(PC, PA);

  return sameSymbols(R1, R2) && sameSymbols(R2, R3);

}



































